#ifndef GTKMM_EXAMPLE_LIENZO_H
#define GTKMM_EXAMPLE_LIENZO_H

#include <gtkmm/drawingarea.h>
#include <gtkmm/toolbutton.h>
#include <gdkmm/general.h>
#include "Comun.h"
#include "Escenario.h"

class Lienzo : public Gtk::DrawingArea {
public:

    Lienzo();
    ~Lienzo();

    void setImagenFondo(const std::string &rutaImagen);
    void setAnchura(unsigned anchura);
    void setAltura(unsigned altura);

    void agregarLineaPajaros(unsigned posXinicial, unsigned posYinicial,
            unsigned posXfinal, unsigned posYfinal);

    void agregarLineaPiso(unsigned posXinicial, unsigned posYinicial,
            unsigned posXfinal, unsigned posYfinal);

    void guardar(Escenario* escenario);
    void cargar(Escenario* escenario);

private:

    /* Estos son los objetos que se dibujan desde el drag and drop */
    class LienzoItem {
    public:

        LienzoItem();
        LienzoItem(Gtk::ToolButton* boton, unsigned posX, unsigned posY);
        ~LienzoItem();

        void draw(const Cairo::RefPtr<Cairo::Context>& contexto,
                bool vistaPrevia);

        void setPosX(unsigned posX);
        void setPosY(unsigned posY);

        void guardar(Escenario* escenario);
        void cargar(Utilidad* util);

    private:
        void crearUtilidad(const Glib::ustring &nombre);

        Utilidad* utilidad;
        Glib::RefPtr<Gdk::Pixbuf> pixbuf;
        unsigned pos_x, pos_y;
    };

    /* Estas son las lineas de salidas de pajaros y suelo */
    class LienzoLine {
    public:

        enum line_color {
            salida_pajaros, piso
        };

        LienzoLine(unsigned posXinicial, unsigned posYinicial,
                unsigned posXfinal, unsigned posYfinal, enum line_color color);
        ~LienzoLine();

        void draw(const Cairo::RefPtr<Cairo::Context>& contexto);

    private:
        unsigned pos_x_inicial, pos_x_final, pos_y_inicial, pos_y_final;
        enum line_color _color;
    };

    /* Sobrecarga de manejadores */
    virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& contexto);

    virtual void on_drag_data_received(
            const Glib::RefPtr<Gdk::DragContext>& contexto, int posX, int posY,
            const Gtk::SelectionData& data, guint info, guint tiempo);

    virtual bool on_drag_motion(const Glib::RefPtr<Gdk::DragContext>& contexto,
            int posX, int posY, guint tiempo);

    virtual bool on_drag_drop(const Glib::RefPtr<Gdk::DragContext>& contexto,
            int posX, int posY, guint tiempo);

    virtual void on_drag_leave(const Glib::RefPtr<Gdk::DragContext>& contexto,
            guint tiempo);

    Glib::RefPtr<Gdk::Pixbuf> fondo;

    /* Item que se esta dragueando */
    LienzoItem* drop_item;

    /* Contenedor con todos los items insertados en el lienzo */
    std::vector<LienzoItem*> items_lienzo;
    std::vector<LienzoLine*> lineas_lienzo;

    /* Booleano que determina si el item se dropeo o no en el lienzo */
    bool drag_data_requested_for_drop, monticulo_existente;
};

#endif